(1) 枚举的jdk实现

下面是枚举代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public enum Labels0 {

ENVIRONMENT("环保"), TRAFFIC("交通"), PHONE("手机"); private

String name;

private Labels0(String name) { this.name = name;

}
public String getName() {
return name;
}
}

在编译后生成的字节码如下:
Xnip20200308_214737.jpg
可以看到枚举被编译后就是一个类,被编辑为final并且继承Enum
里面的枚举都是static finak的常量,静态的所以是单例的
重点:
++枚举类型没有可以访问的构造器,是真正的 final;是实例受控的,它们是单例的泛型化; 本质上是单元素的枚举;提供了编译时的类型安全。 单元素的枚举是实现单例的最佳方法!++

(2) jdk序列化

定义:将实现Serializable接口的对象转成一个字节数组,并且可以讲字节数组转换为对象

  1. 实现序列化
  • 实现Serializable接口
  • 该接口只是一个可序列化的标志并没包含实际的属性和方法
  • 如果不在该方法中添加readObject 和 writeObject 则采取默认的序列化机制,如果添加了这两个方法还想执行默认的序列化机制 则需要分别调用 defaultReadObject()和defaultWriteObject()方法
  • 为了保障安全性可以使用transient关键字修饰不必序列化的属性因为在序列化的过程中private的属性也会被序列化
  • 实现ExternalSerializable接口 可以对要求序列化的内容进行控制,控制那些属性能被序列化,那些不能被序列化
  1. 反序列化
  • 实现Serializable接口接口反序列化,无需调用构造方法,完全处于字节
  • 实现ExternalSerializable接口方法在反序列化的时候调用构造方法
  1. 注意事项
  • 被static 修饰的对象不会被序列化
  • 对象的类名 属性都会被序列化,方法不会被序列化
  • 保证序列化对象对象所在类的属性也是可以被序列化的
  1. ObjectOutputStream 是专门用来输出对象的输出流;
    ObjectOutputStream 将 Java 对象写入 OutputStream。可以使用 ObjectInputStream 读取 (重构)对象。
  2. serialVersionUID
    用来判断序列化的版本号的,如果反序列化的时候如果版本号不一致则会抛异常

(3)ERROR 和 Exception

  1. error 是程序无法处理的错误,是有jvm虚拟机器抛出的异常如。outofmemorayerror,虚拟机将发生这种异常的线程直接终止
  2. exception 是可以程序可以处理的异常,是程序主动抛出的异常。
    异常氛围检查时异常和非检查异常,检查异常需要try cache 非检查异常无需try cache

(4)常见的RuntimeException

  1. NullPointerExcepiton 空指针
  2. IllegalArgumentExcepiton 参数无效
  3. ArraysOutOfBoundsExcepiton 数组越界
  4. ClassCaseException 类型转换异常
  5. NumberFormatException 数字转换异常

(5)泛型擦除

编辑器生成的字节码是不包含泛型信息的,编译过程中会擦除泛型。限定类型会指向限定类型,非限定类型则指向object